/**
 * 
 */
package neptune.manager.validator;

import java.util.ArrayList;

import neptune.manager.utils.Logger;
import neptune.manager.utils.Logger.LogContext;
import neptune.manager.validator.Validator.Status;

/**
 * Incapsula il risultato di un processo di validazione. Il risultato e'
 * espresso in termini di:<br>
 * <ul>
 * <li>status: {@link Validator.Status}</li>
 * <li>log: {@link LogContext}</li>
 * </ul>
 * Poiche' un oggetto ValidatorResult rappresenta un albero di oggetti
 * ValidatorResult, quando si crea un figlio dell'oggetto corrente, tramite
 * {@link ValidatorResult#createChild(String)} viene creato un figlio anche per
 * il LogContext contenuto nel ValidatorResult padre. Il LogContext figlio sara'
 * il LogContext contenuto nel ValidatorResult figlio.
 * 
 * 
 * @author Roberto Bifulco [RobertoBifulco.it] [info@robertoBifulco.it]
 * 
 */
public class ValidatorResult {
	private Status status = Status.VALID;
	private LogContext log;
	private ArrayList<ValidatorResult> results = new ArrayList<ValidatorResult>(
			0);

	/**
	 * Crea un oggetto ValidatorResult inizializzandolo a VALID e creando un
	 * LogContext tramite {@link Logger#createLogContext(String)}
	 */
	public ValidatorResult() {
		super();
	}

	/**
	 * Crea un oggetto ValidatorResult inizializzandolo a VALID e creando un
	 * LogContext tramite {@link Logger#createLogContext(String)}, il cui id e'
	 * quello passato come argomento al metodo
	 * 
	 * @param logId
	 */
	public ValidatorResult(String logId) {
		super();
		this.log = Logger.createLogContext(logId);
	}

	/**
	 * Crea un oggetto ValidatorResult adoperando come logContext quello passato
	 * come argomento.
	 * 
	 * @param context
	 */
	public ValidatorResult(LogContext context) {
		super();
		this.log = context;
	}

	/**
	 * Crea un figlio per questo ValidatorResult. Il figlio creato contiene al
	 * suo interno gia' il LogContext figlio del LogContext contenuto in questo
	 * oggetto.
	 * 
	 * @param childId
	 * @return
	 */
	public ValidatorResult createChild(String childId) {
		ValidatorResult result = new ValidatorResult();
		result.setLog(log.createChild(childId));
		results.add(result);
		return result;
	}

	/**
	 * Ottiene lo stato di questo ValidatorResult. Lo stato e' ottenuto
	 * verificando tutti gli stati facenti parte del sotto-albero di cui questo
	 * oggetto e' la radice. Se uno qualsiasi dei figli e' nello stato
	 * {@link Status} ERROR, allora anche questo ValidatorResult si trovera' in
	 * tale stato.
	 * 
	 * @return
	 */
	public Validator.Status getStatus() {
		for (ValidatorResult result : results) {
			if (result.getStatus() == Status.ERROR)
				status = Status.ERROR;
		}
		return status;
	}

	/**
	 * @return the log
	 */
	public LogContext getLog() {
		return log;
	}

	/**
	 * @param log
	 *            the log to set
	 */
	public void setLog(LogContext log) {
		this.log = log;
	}

	/**
	 * @param status
	 *            the status to set
	 */
	public void setStatus(Status status) {
		this.status = status;
	}

}